Node events 事件触发器
Node 是一个主要通过 API 使用异步事件模型的 I/O 操作,某些类型对象或触发器周期的触发一个命名事件到 事件队列,如 net.Server
对象在每次连接时出发一个事件,以及 fs.readStream
对象在文件打开时也触发一个事件。
在这些过程中,所有能产生事件的对象都是 events.EventEmitter
实例,其中 events 模块中就只提供了一个 events.EventEmitter
对象,因此 EventEmitter 的核心就是事件的触发和事件的监听功能的封装。
注册事件 & 监听器
通过 event.emit
对象创建一个 some_event
对象,并在 3000ms 后触发该事件,然后通过 event.on
来触发该事件,此时 event.on
将是一个监听事件触发的作用。
1 2 3 4 5 6 7 8 9 10 11 12
| const EventEmitter = require('events').EventEmitter const event = new EventEmitter()
event.on('some_event', function () { console.log('some_event 事件触发') })
setTimeout(function () { event.emit('some_event') },3000)
|
除此之外,EventEmitter 的每个事件由一个事件名和诺干的参数组成,事件名则是一个字符串形式,这通常表示一定的语义,对于每个事件、EventEmitter 还提供了一个支持多个事件的监听器,当该事件触发时,事件的监听器依次都会被调用,事件的参数会作为回调参数传递。
对于多个事件,当事件被触发时将会依次被输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const events = require('events') const emitter = new events.EventEmitter()
emitter.on('some_event', function (args1,args2) { console.log('some_event1', args1, args2) })
emitter.on('some_event', function (args1,args2) { console.log('some_event2', args1, args2) }) emitter.emit('some_event', '参数1','参数2')
|
this
emit 方法允许为监听器传入任意参数,之后事件监听器中的 this
方法将会用于输出当前的事件属性和传入的方法等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const events = require('events') const eventEmitter = new events.EventEmitter
eventEmitter.on('some_event', function (a,b) { console.log('some_event') console.log(a,b, this) })
eventEmitter.emit('some_event','a','b')
|
on at once
在 event
中,监听事件的方法可以通过 on
和 once
进行实现,两者的主要区别是后者只可以监听单次的 listener
函数,当下次在触发事件时,将会移出此监听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const event = require('events') const eventEmitter = new event.EventEmitter
eventEmitter.on('some_event', function () { console.log('eventEmitter some_event'); })
eventEmitter.emit('some_event') eventEmitter.emit('some_event')
eventEmitter.once('someEvent', function () { console.log('eventEmitter someEvent'); })
eventEmitter.emit('someEvent') eventEmitter.emit('someEvent')
|
添加/移出监听器事件
通过 once
创建一个事件,且侦听 start
事件,并通过 eventEmitter.emit
方法来进行调用此方法,因此输出的是 netListener
和 start
事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const events = require('events') const eventEmitter = new events.EventEmitter
eventEmitter.once('newListener', function (event, listener) { if (event == 'start') { eventEmitter.on('start', function () { console.log('start 2') }) console.log('start') } })
eventEmitter.on('start', function () { console.log('eventEmitter start') })
eventEmitter.emit('start')
|
⬅️ Go back